Technical Note TN2056
Installable Keyboard Layouts

目次

Mac OS X 10.2 には、ファイルまたはバンドルを標準フォルダに入れることによって新しいキーボード配列をインストールできる機能が追加されています。

また、XML 形式のテキストファイルを使って、Unicode 対応のキーボードを定義できるようにもなりました。このようにして定義されたキーボードは、『Supporting Unicode Input』で説明されている 'uchr' リソースキーボードと同じ機能を持ちます。実のところ XML ファイルは、uchr 形式に変換され、以降 'uchr' リソースとまったく同じように処理されます。

[2002 年 9 月 9 日]






インストール

キーボード配列は、次のいずれかの場所にインストールできます。



/Library/Keyboard Layouts/

‾/Library/Keyboard Layouts/

/Network/Library/Keyboard Layouts/


/Library/ にあるリソースは、当該マシンのすべてのユーザの間で共有されます。‾/Library/ は、当該ユーザだけが見ることができます。/Network/Library/ のリソースは、ネットワーク上のすべてのユーザの間で共有されます。

キーボードにはそれぞれを一意に特定する ID 番号が付いています。これらは、エンドユーザには示されません。システムは 同じ ID 番号を持つキーボードを 2 つ以上検出した場合には、重複をなくすために必要に応じてキーボードの番号を付け直します。

新しいキーボードをインストールした後、キーボードを使えるようにするためには、ユーザは一度ログアウトしその後再びログインする必要があります。

先頭に戻る



サポートされているキーボードデータの形式

次のいくつかの形式がサポートされています。

  1. 旧式のキーボードスーツケース(リソースファイル)

    Keyboard.rsrc (KCHRuchritlkkcnskcs#kcs4kcs8 の各リソースを含むリソースファイル)

    このキーボードの名前は、KCHR/uchr リソースの名前に基づいており、ローカライズはできません。エンコーディングとしては、キーボードが属しているスクリプトのエンコーディングが使用されます。Unicode 対応のキーボードの場合は、UTF-8 (負数のID)です。リソースファイルには、1 つ以上のキーボードが含まれています。このリソースは、リソースフォークまたはデータフォークのどちらかに入れることができます(両方には入れられません)。ファイル拡張子は、.rsrc でなければなりません。

    アイコンは、Mac OS X で新しく取り入れられた、icns アイコン形式と同じ kcns リソース形式でも、Mac OS 9 で使われている古い、kcs#/kcs4/kcs8 形式でもかまいません。アイコンリソースがない場合、「入力メニュー」および「地域情報」におけるキーボードのアイコンは、汎用アイコンとなります。

    Mac OS 9 のキーボードスーツケースを使うには、ファイル拡張子、.rsrc を付けます。

  2. ローカライズされたキーボードスーツケースバンドル

        Roman.bundle/
            Contents/
                Info.plist
                PkgInfo
                Resources/
                    MyLayouts.rsrc
                    English.lproj/
                        InfoPlist.strings
                version.plist
    


        InfoPlist.strings ファイルの内容:
            "U.S." = "U.S.";
            "Australian" = "Australian";
            "Austrian" = "Austrian";
            ...
    


    Info.plist ファイル、PkgInfo ファイル、および version.plist ファイルは、標準のバンドル規約に従います。

    MyLayouts.rsrc ファイル(名前は任意ですが、拡張子は .rsrc とする必要があります)には、KCHRuchritlkkcnskcs#kcs4kcs8 のリソースのセットが含まれています。

    このリソースファイルに、1 つ以上のキーボード定義を含めることができます。アイコンは、形式 1 と同様です。キーボード配列の名前は、各種 .lproj フォルダにある InfoPlist.strings ファイルを使ってローカライズできます。ローカライズされていないキー(左側)は、キーボードのリソース名と同じで、ネイティブのエンコーディングではなく Unicode で表されています。たとえば、Roman 用の KCHR リソース名は、MacRoman 形式で表されますが、InfoPlist.strings ファイルの対応するキーは、Unicode で表されなければなりません。

    この形式は、データフォークのリソースのみをサポートします。

  3. XML キーボード定義

    これは、本書の後半で示す仕様に準拠した妥当な XML ファイルで、拡張子は .keylayout でなければなりません。以下で説明しますが、この名前は常に Unicode 形式ですが、ローカライズはできません。

    Mykeyboard.keylayout

    コンパイル時にエラーがなければ、XML キーボードは、インストール後に、「地域情報」の「入力メニュー」ペインで利用できるようになります。ファイルにエラーがあれば、「uchr XML compiler 」で始まるエラーメッセージが console.log に書き込まれます。エラーが XML 構文エラーの場合、ファイル中のエラーが発生した行が示されます。通常は、最初のエラーだけが診断され、以降の解析は中止されます。

    console.log は、ログアウトしてログインすると消去されるので、エラーメッセージを見るには、「地域情報」を開き、「入力メニュー」ペインに移動することによって、キーボードをコンパイルさせます。 いずれかのキーボードに変更があった場合は、アプリケーションを起動し入力を行うことで、すべてのキーボードをコンパイルすることができます。対象のキーボードが 「地域情報」に表示されなかった場合は、console.log でエラーメッセージを確かめます。

    この形式のキーボードには、標準の icns 形式の任意のアイコンファイルを関連付けることができます。アイコンファイルの名前は、キーボードファイルと同じ名前で、.icns という拡張子が付きます。

    Mykeyboard.icns

    このファイルがない場合、入力メニューおよび「地域情報」におけるキーボードのアイコンは、汎用アイコンとなります。

  4. ローカライズされた XML キーボードバンドル

        MyKeyboards.bundle/
            Contents/
                Info.plist
                PkgInfo
                Resources/
                    MyKeyboard1.keylayout
                    MyKeyboard1.icns
                    MyKeyboard2.keylayout
                    MyKeyboard2.icns
                    English.lproj/
                        InfoPlist.strings
                    version.plist
    


        InfoPlist.strings ファイルの内容:
            "MyKeyboard1" = "MyKeyboard1";
            "MyKeyboard2" = "MyKeyboard2";
    


    この形式は、XML キーボードに対してローカライズされた名前をサポートします。このバンドルには、.keylayout という拡張子を持つ複数の XML ファイルが含まれています。ローカライズの方法は、上記の形式 2 と同様です。.icns ファイルはキーボードごとに任意です。アイコンファイルがなければ、入力メニューおよび「地域情報」におけるキーボードのアイコンは、汎用アイコンとなります。

本書の残りの部分では、新しい XML キーボードデータ形式について説明します。

先頭に戻る



XML DTD

XML キーボードは、以下の XML の DTD (文書型定義)に従う必要があります。



<!-- 全体の構成 -->
<!ELEMENT keyboard (layouts+, modifierMap+, keyMapSet+, actions*, terminators*)>
<!ATTLIST keyboard group NMTOKEN #REQUIRED >
<!ATTLIST keyboard id NMTOKEN #REQUIRED >
<!ATTLIST keyboard name CDATA #REQUIRED >
<!ATTLIST keyboard maxout NMTOKEN #IMPLIED >

<!-- ハードウェア配列の要素 -->
<!ELEMENT layouts (layout+) >
<!ELEMENT layout EMPTY >
<!ATTLIST layout first NMTOKEN #REQUIRED >
<!ATTLIST layout last NMTOKEN #REQUIRED >
<!ATTLIST layout modifiers IDREF #REQUIRED >
<!ATTLIST layout mapSet IDREF #REQUIRED >

<!-- 修飾子の記述-->
<!ELEMENT modifierMap (keyMapSelect+) >
<!ATTLIST modifierMap id ID #REQUIRED >
<!ATTLIST modifierMap defaultIndex NMTOKEN #REQUIRED >

<!ELEMENT keyMapSelect (modifier+) >
<!ATTLIST keyMapSelect mapIndex NMTOKEN #REQUIRED >

<!ELEMENT modifier EMPTY >
<!ATTLIST modifier keys CDATA #REQUIRED >

<!-- キーボードマッピング -->
<!ELEMENT keyMapSet (keyMap+) >
<!ATTLIST keyMapSet id ID #REQUIRED >

<!ELEMENT keyMap (key+) >
<!ATTLIST keyMap index NMTOKEN #REQUIRED >
<!ATTLIST keyMap baseMapSet IDREF #IMPLIED >
<!ATTLIST keyMap baseIndex NMTOKEN #IMPLIED >

<!ELEMENT key (action*) >
<!ATTLIST key code NMTOKEN #REQUIRED >
<!ATTLIST key output CDATA #IMPLIED >
<!ATTLIST key action IDREF #IMPLIED >

<!-- アクション(状態レコード)-->
<!ELEMENT actions (action+) >
<!ELEMENT action (when+) >
<!ATTLIST action id ID #IMPLIED >

<!ELEMENT when EMPTY >
<!ATTLIST when state NMTOKEN #REQUIRED >
<!ATTLIST when through NMTOKEN #IMPLIED >
<!ATTLIST when output CDATA #IMPLIED >
<!ATTLIST when multiplier NMTOKEN #IMPLIED >
<!ATTLIST when next NMTOKEN #IMPLIED >

<!-- 終了記号 -->
<!ELEMENT terminators (when+) >


先頭に戻る

XML のファイル構造

キーボード配列の記述は、標準の XML 形式のファイルです。したがって、XML の仕様に従います。このテキストファイルのエンコーディングは、Unicode の UTF-8 または UTF-16 でなければなりません。これを明確に示すために、ファイルの先頭に xmlDOCTYPE の両方の宣言文を入れるとよいでしょう。



<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE keyboard SYSTEM "file://localhost/System/Library/DTDs/KeyboardLayout.dtd">


<keyboard> 要素

トップレベル要素は <keyboard> です。 <keyboard> には次の必須属性があります。

group

この配列が表示されるキーボードメニューのセクション。現在これはスクリプトコードです。Unicode のキーボードは 126 というスクリプトコードを持ちます。

id

キーボードの一意の ID。現在これは数字で、group で指定されたスクリプトバンドルと一致している必要があります。Unicode のキーボードには 負数の ID が割り当てられます。この ID が、他のキーボードの ID と重複する場合、システムは新しい ID を割り当てます。以下で詳しく説明します。

name

「キーボードメニュー」に表示されるキーボードの名前。これは、キーボードファイル自体で使用されているエンコーディング(UTF-8、 UTF-16 など)で、 キーボードのスクリプトに対応しているエンコーディングではありません。この名前はローカライズできませんが、バンドル機構を利用すればキーボードの名前のローカライズも可能です。

次の属性は省略可能です。

maxout

1 回キーを押すことで生成できる UTF-16 値の最大数。



この <keyboard> 要素には、厳密に 1 つの <layouts> 要素、 1 つ以上の <modifierMap> 要素 、 1 つ以上の <keyMapSet> 要素 、省略可能な <actions> 要素、省略可能な <terminators> 要素が含まれています。

Unicode 対応のキーボード(uchr または XML)は、2 つのクラスに分類されます。1 つは、特定の Mac OS スクリプトコードに関連付けられているキーボードのクラスです。このクラスに属するキーボードは通常、Mac OS スクリプトに関連付けられているエンコーディングに変換できる Unicode の文字列だけを生成します。 Mac OS X でサポートされているスクリプト(および関連付けられるキーコード)は、 Roman (0)、Japanese (1)、 Simplified Chinese (25) 、Traditional Chinese(2), Korean (3)、Cyrillic (7)、および Central European (29) です。その他のスクリプトをサポートする予定はありません。このクラスのキーボードは、Unicode 対応アプリケーションおよび Unicode 非対応(WorldScript)アプリケーションの両方で利用可能です。

スクリプトに関連付けられているキーボードが、そのスクリプトに関連付けられているエンコーディングに変換できない Unicode の文字列を生成する可能性もあります。そのような文字列がある場合、Unicode 非対応アプリケーションで疑問符(?)が表示されてしまうという不都合があります。たとえば、日本語の入力メソッドであることえりでは、どのような Unicode 文字も生成できますが、MacJapanese 以外の文字は、Unicode 対応アプリケーションでのみサポートされます。

もう 1 つのキーボードクラスは、上記に挙げたどのスクリプトにも関連付けられていない Unicode 文字を生成します。このクラスのキーボードは、Unicode 対応アプリケーションでのみ利用可能で、ID 値は負数です。これらのキーボードは、スクリプトコードが 126 のグループに割り当てられます。

キーボードをスクリプトコードに割り当てるかどうかを判断する大まかな目安は、キーボードを使って入力する「典型的」なテキストがすべてスクリプトのエンコーディングにあるかどうかです。ユーザは、WorldScript アプリケーションで?が表示される理由を理解しづらいでしょうから、確実な方法を取っておくのが一番です。



<layouts> 要素

<layouts> 要素には属性がなく、1 つ以上の <layout> 要素を持ちます。これらの要素が総体として、各ハードウェアキーボード群のキーマッピングを制御するのはどの <modifierMap> 要素とどの <keyMapSet> 要素かを定義します。

物理的な位置が先にある <layout> 要素が、どの <layout> 要素の ID の範囲にも含まれていない ID を持つキーボードのマッピングを制御します。

アップルでは、既存のキーボードハードウェア ID の 1 つに新しいキーボードハードウェア ID をマッピングします。したがって通常は、既存のキーボード配列から <layouts> 要素全体をコピーしてペーストするだけで十分です。



<layout> 要素

<layout> 要素は空の要素です(つまりサブ要素を持たず、<layout /> という空の形で記述されます)。どの <modifierMap><keyMapSet> を使用するかをハードウェアキーボード ID の各範囲ごとに定義します。<layout> 要素には次の必須属性があります。

first

この要素が制御する最初のキーボードクラスのハードウェア ID

last

この要素が制御する最後のキーボードクラスのハードウェア ID

modifiers

この範囲のハードウェアキーボードクラスに使用する <modifierMap> 要素の識別子

mapSet

この範囲のハードウェアキーボードクラスに使用する <mapSet> 要素の識別子

例:



<layouts>
 <layout first="0" last="17" modifiers="commonModifiers" mapSet="ANSI" />
 <layout first="18" last="18" modifiers="commonModifiers" mapSet="JIS" />
 <layout first="21" last="23" modifiers="commonModifiers" mapSet="JIS" />
 <layout first="30" last="30" modifiers="commonModifiers" mapSet="JIS" />
 <layout first="194" last="194" modifiers="commonModifiers" mapSet="JIS" />
 <layout first="197" last="197" modifiers="commonModifiers" mapSet="JIS" />
 <layout first="200" last="201" modifiers="commonModifiers" mapSet="JIS" />
 <layout first="206" last="207" modifiers="commonModifiers" mapSet="JIS" />
</layouts>




<modifierMap> 要素

<modifierMap> 要素は、修飾キーの組み合わせの <keyMap> テーブル番号へのマッピングを定義します。 この要素には、1 つ以上の <keyMapSelect> 要素が含まれていて、各要素はそれぞれ 1 つの <keyMap> テーブルに対応しています。

この要素には 2 つの必須属性があります。

id

任意の文字列で、ほかの場所でこの <modifierMap> を識別するために使用されます(現在は <layout> 要素の中でのみ)。この識別子は、すべての <modifierMap> 要素を通じて一意でなければなりません。

defaultIndex

<modifierMap> 内のどの <modifier> 要素においても明示的に指定されていない修飾キーの組み合わせに使用するテーブル番号。



<keyMapSelect> 要素

この要素は、特定のキーマッピングテーブルを選択する修飾キー群を定義します。この要素は 1 つ以上の <modifier> 要素を含み、各 <modifier> 要素は、修飾キーの組み合わせを指定します。指定された修飾キーの組み合わせのどれかと一致する修飾子マッピングテーブルのどのエントリにも、このテーブルの番号が入れられています。<keyMapSelect> 要素は、順番に処理されます。したがって 2 つ以上の <keyMapSelect> 要素が同じ修飾キーの組み合わせを指定した場合には、後の要素が先の要素を上書きします。

この要素には 1 つの必須属性があります。

mapIndex

<keyMapSelect> 要素内の <modifier> 要素によって指定された修飾キーの組み合わせのマッピング先テーブル番号で、開始値は 0 です。基盤の実装が配列を使うので、このテーブル番号は、連続していて、飛び番があってはなりません。



<modifier> 要素

この要素は、この要素を内包する <keyMapSelect> 要素の中で指定されたテーブル番号にマッピングする修飾キーの組み合わせを 1 セット以上指定します。この要素は、 XML で言うところの空の要素となります(<modifier /> と記述されます)。この要素には 1 つの必須属性があります。

keys

1 つ以上の修飾キーの組み合わせを指定する文字列。この文字列は、空白文字によって区切られた、次の単語の 1 つ以上の並びで構成されます。

shift

左の Shift キー

rightShift

右の Shift キー

anyShift

左右いずれかの Shift キーに一致

option

左の Option キー

rightOption

右の Option キー

anyOption

左右いずれかの Option キーに一致

control

左の Control キー

rightControl

右の Control キー

anyControl

いずれかの Control キー

command

Command キー

caps

Caps Lock key

単語が指定されていれば、それに対応する修飾キーが押されている必要があります。単語が指定されていなければ、それに対応する修飾キーが押されていてはなりません。単語の後に ? が続く場合は、 修飾キーの状態(押されていても押されていなくても)は無関係であることを意味します。たとえば command? となっている場合、この<modifier> 要素は、Command キーが押されていても押されていなくてもどちらでも構わない(つまり Command キーの状態は無関係である)修飾キーの組み合わせが指定されていることを意味します。

「any」の付いた修飾子は、左右のキーのどちらかあるいは両方が押されている修飾キーの組み合わせと一致します。たとえば anyShift は、左 Shift キーまたは右 Shift キーのどちらか、あるいは両方が押されている修飾キーの組み合わせと一致します。どちらも押されていない修飾キーの組み合わせとは一致しません。anyShift? は、左右どちらかのあるいは両方の Shift キーを押す押さないに関係なく、すべての修飾キーの組み合わせと一致します。

多くのハードウェアキーボードは、修飾キーが左右両方にはないので、通常は各種の any 変数の形(anyShiftanyOptionanyControl など)を使って修飾子を指定する方が安全です。



<modifier keys="anyShift? anyOption caps?" />


この指定は、左右どちらかの(または両方の)Option キーが押されていて Command キー および左右の Control キーが押されていないすべての修飾キーの組み合わせに一致します。



<modifier keys="caps" />
<modifier keys="command" />


この指定は、Caps Lock キーが押されていてその他の修飾キーが押されていないか、command キーが押されていてその他の修飾キーが押されていないすべての修飾キーの組み合わせに一致します。



<modifier keys="" />
<modifier keys="anyShift command caps?" >
<modifier keys="anyShift? command caps" />


この指定は、次の修飾キーの組み合わせに一致します。

  • どの修飾キーも押されていない
  • Shift キーか Command キーが押されていて、Control と Option が押されていない
  • Caps Lock キーとCommand キーが押されていて、Control と Option が押されていない


<keyMapSet> 要素

この要素は、キー入力に対する結果をマッピングするのに使用するテーブルのセットを集約します。通常は、ハードウェアキーボードのクラスごとにテーブルが 1 セットあります。ヨーロッパで使用されている ISO キーボードは、米国で使用されている ANSI キーボードと同じ配列で対応できるので、対応する必要があるのは、ANSI と JIS(日本で使用)の 2 つのクラスとなります。

この要素には、 1 つ以上の <keyMap> 要素が含まれており、各 <keyMap> 要素は、仮想キーコードの結果への特定のマッピングを指定します。 通常は、関連する修飾キーの組み合わせごとにこのようなテーブルが 1 つあります。

この要素には 1 つの必須属性があります。

id

XML ファイル内の別の場所から参照する時に、この keyMapSet の識別子として機能する文字列。この識別子は、すべての keyMapSet 要素を通じて一意でなければなりません。



<keyMap> 要素

この要素は、仮想キーコードと結果の特定のマッピングを指定します。仮想キーコードを受け取ったときに実行する内容を指定する <key> 要素を 1 つ以上含みます。結果のマッピングテーブルのサイズは、keyMapSet 内のテーブルが指定する最大の仮想キーコードによって決まります。指定されていないエントリの結果は NULL です(つまり何も実行されません)。この要素には 1 つの必須属性と 2 つの省略可能な属性があります。

index

テーブル番号。 <keyMapSelect> 要素から参照されます。

baseMapSet

修飾の結果がこの要素となる <keyMap> 要素を含む、基本マップセットの識別子。現在の要素内にある <key> エントリは、指定された基本 <keyMap> 要素のエントリをオーバーライドします。オーバーライドされなかった仮想のキーコードは基本 <keyMap> 要素からコピーされます。この属性が指定されている場合、baseIndex 属性も指定されている必要があります。

baseIndex

baseMapSet により指定される <keyMapSet> 内の <keyMap> 要素のテーブル番号。 現在要素内にある <key> エントリは、指定された基本 <keyMap> 要素のエントリをオーバーライドします。オーバーライドされなかった仮想キーコードは、基本 <keyMap> 要素からコピーされます。この属性が指定されている場合、baseMapSet 属性も指定されている必要があります。

通常、baseMapSetbaseIndex は、特定のハードウェアキーボードのための オーバーライドを提供するために使用されます。最も多い使い方は、ANSI キーボード配列と JIS キーボード配列の違いを提供することです。たとえば次のようになります。



<keyMapSet id="JIS">
    <keyMap index="0" baseMapSet="ANSI" baseIndex="0">
   (JIS キーボードにおいて、ANSI 配列をオーバーライドする)


<key> 要素

この要素は、特定の仮想キーコードを受け取った時に実行すべき内容を指定します。この要素は、空の場合もあれば、空でない場合もあります。動作がインラインで指定されている場合のみ空ではありません。

この属性には次の必須属性があります。

code

この <key> 要素が対応する仮想キーコードを表す 10 進法。この値は、1 つの <keyMap> 要素内にあるすべての <key> 要素を通じて一意でなければなりません(同じキーを異なる 2 つの形でマッピングすることはできません)

いずれかの時点で、キーコードを指定するために文字実体を利用できるようにする予定ですが、まだ実装はされていません。

<key> 要素は次の 3 つのいずれかの形式を取ります。

  1. <key code="virtualkeycode" output="string" />

    指定の仮想キーコード(virtualkeycode) を受け取ると、指定の UTF-16 の値からなる文字列(string) は、無条件に出力されます。この文字列には、UTF-16 のコードポイントが少なくとも 1 つは必要で、XML の属性値として正当な任意の文字を含めることができます。リテラル文字は ASCII に限定されておらず、XML ファイル自身は Unicode でエンコーディングされているので、多くの文字は直接入力できます。

    Unicode のスカラー値は、XML 数字実体を使って、10 進数または16 進数のいずれかを指定できます。プレーン 0 以外の Unicode のスカラー値は、2 つの数字実体ではなく 1 つの数字実体によって指定します。これは、2 つの UTF-16 の値(サロゲートペア)に変換されます。XML における不正な文字(<"、C0 制御値など)は、数字実体を使って指定する必要があります。文字実体はサポートされていません。

    例:

    <key code="0" output="“Wow!&#8594;&#x2000B;”" />

    この <key> 要素は、仮想キーコードの 0(US キーボード配列では a )を打つと、

    “Wow!

    そしてその後に、U+2192 RIGHTWARDS ARROWU+2000B ( プレーン 2 の表意文字、サロゲートペアとして表される)、そして最後に



    が続く Unicode 文字列が出力されます。16 進数で表した UTF-16 文字列全体は次のようになります。

    201C 0057 006F 0077 0021 2192 D840 DC0B 201D

  2. <key code="virtualkeycode" action="name" />

    指定の仮想キーコード (virtualkeycode) を受け取ると、指定の名前 (name) のアクションが実行されます。アクションは、<actions> 要素によって指定します。以下を参照してください。

  3. <key code="virtualkeycode">
        <action>
            (無名アクション)
        </action>
    </key>
    


    指定の仮想キーコード (virtualkeycode) を受け取ると、<key> 要素内の 1 つの <action> 要素が実行されます。その結果は、上記の 2 番目の形式において、<actions> 要素内で <action> 要素を指定し、名前で参照した場合と同じです。このようにして指定した無名のアクションは、コピー要素(baseMapSetbaseIndex)を使う以外の方法では、複数の <keyMap> テーブルから参照することはできません。



<actions> 要素

<actions> 要素は省略可能です。1 つの XML 文書に指定できる数は 1 つまでです。<actions> 要素は、<key> 要素から参照できる名前付きのアクションを指定する 1 つ以上の <action> 要素を含んでいます。



<action> 要素

<action> 要素は、ステートマシンの現在の状態に基づいて取るべき一連のアクションを指定します。これは、1 つ以上の <when> 要素によって指定されます。各 <when> 要素は、1 つ以上の状態を指定し、またアクションが実行され、現在の状態が指定した状態に当てはまったときに取るべきアクションを指定します。この要素には 1 つの属性があります。

id

このアクションを識別する任意の文字列。すべての <action> 要素を通じて、一意でなければなりません。

この id 属性は、<actions> 内に <action> がある場合には必須ですが、<action><key> 要素内にある場合には指定してはなりません。



<when> 要素

この要素は、ステートマシンが特定の状態あるいは一連の状態にある場合の、特定の結果を指定します。この要素にはいくつかのバリエーションがありますが、いずれも空の要素となります。属性は次のとおりです。



state

必須。この属性は、この <when> 要素を適用する、ステートマシンの状態を指定します。state には、任意の文字列、10 進数、または基本(初期)状態を表す none という特別な文字列を指定します。 <when> 要素で範囲を指定する場合、これは範囲の開始値となり、その場合には値は数字でなければなりません。none を指定する <when> 要素は、<when> 要素を内包する <action> 要素の最初の要素でなければなりません。

through

省略可能。指定した場合、<when> 要素は、1 つの状態でなく複数の状態を範囲で指定します。値は、10 進数でなければなりません。省略した場合は、単独の状態が指定されます。

next

省略可能。指定した場合は、次に入るべき状態を示します。 <when> 要素で範囲を指定する場合、値は 10 進数でなければなりません。none の状態がデフォルト値となります(すなわちデフォルトの基本状態に戻ります)。

output

省略可能。指定した場合は、出力する文字列を示します。 <when> 要素が範囲を指定する場合、単独の UTF-16 のコードポイント でなければなりません。デフォルトは出力なしです。

multiplier

省略可能。1 から 255 の間の 10 進数となります。 指定した場合、<when> 要素は、範囲を指定する必要があります。入力時の状態と範囲の最初の値(state 属性で指定)の差をこの値で乗じ、next の状態の数値と出力される UTF-16 の値の一方または両方に加算されます。



コンパイラは、名前付きの状態に自動的に番号を割り当てます。一方、状態番号は直接参照することもできます。コンパイラはどの直接参照の番号よりも大きい番号を名前付きの状態に割り当てるので、名前付きの状態と番号付きの状態が重複することはありません。直接参照の番号が大きすぎて、名前付き状態に割り当てるのに必要な十分な数の番号が残っていない場合には、エラーが発生します。

<when> 要素は、次の 2 とおりの形で考えるのが最もよいでしょう。

  1. <when state="id" [next="id"] [output="string"] />

    この形式は、省略可能な next 状態と省略可能な output 文字列を指定します。これらのうち 1 つは指定されている必要があります。圧倒的に一番よく使われる形式です。

    この形式についてさらに理解するためには、<terminators> 要素の説明の後に示す例を参照してください。

  2. <when state="first" [through="last"] [multiplier="number"] [output="char"] [next="next"] />

    この形式は、入力時の状態が first の状態と last の状態の間にあるとき、next 状態は(入力時の状態の値 - first)* multipler +next、出力文字は(入力時の値 - first)* multipler + char、のどちらかまたは両方でなければならないことを指定します。 

    この形式は、連続した値を持つ大きな範囲の文字を生成するキーボードに使われます。たとえば、Unicode Hex キーボード、または韓国語のハングル文字を生成するキーボードなどがあります。

    この形式についてさらに理解するには、『Supporting Unicode Input』および Unicode Hex キーボード配列の XML ファイルを参照してください。



<terminators> 要素

この要素は省略可能です。1 つのファイルに指定できる数は 1 つまでです。この要素には、現在の状態に該当する動作がないときに実行すべきことを指定する一連の <when> 要素が含まれています。各<when> 要素には単一の状態と、単一の出力文字列を指定できます。next 状態は指定できません。 特定の状態に対応する <when> 要素がない場合、デフォルトでは基本(デフォルト)状態に戻ります。



デッドキーの完全な例

次に、鋭アクセント記号付きの e を処理するデッドキーの組み合わせの指定方法を示す、キーボード配列の抜粋を示します。US キーボード配列を前提にしています。

Shift キーが押されていない場合のキーボードの <keyMap> が次のようになっています。



<key code="14" action="e" />


これは、14 というキーコードを受け取ったときに e という名前のアクションを実行することを示しています。

Option キーに対応する <keyMap> は次のようになっています。



<key code="14" action="acute" />


これは、Option キーが押された状態で 14 というキーコードを受け取った時に、"acute" という名前のアクションを実行することを示します。



<actions>
    <action id="acute">
        <when state="none" next="acute" />
    </action>
    <action id="e">
        <when state="none" output="e" />
        <when state="acute" output="é" />
    </action>
</actions>
<terminators>
    <when state="acute" output="´" />
</terminators>


e が単独で入力された場合は、 e という結果が得られます。option + e が e に続けて入力された場合は、é が結果として得られます。option + e に続いて別の任意のキーが入力された場合は、単独の ´ に続いて 2 番目のキーが生成する結果が生成されます。

アクションを次のように指定することもできます。

Shift なし



<key code="14">
    <action>
        <when state="none" output="e" />
        <when state="acute" output="é" />
    </action>
</key>


Option キー:



<key code="14">
    <action>
        <when state="none" next="acute" />
    </action>
</key>


しかしこの方法は、同じアクションを 2 箇所以上で指定する必要がある場合は煩雑です。すべてのアクションを 1 箇所に集めた方が、ファイルも読みやすくなります。

キーボード配列の例は、このテクニカルノートで全体を示すには長すぎます。配列全体の例については、/System/Library/Keyboard¥ Layouts/Unicode.bundle/Contents/Resources/ にある Unicode Hex Input キーボードおよびその他のキーボードを参照してください。

先頭に戻る

 

参考文献

The Unicode Standard, Version 3.0. Addison-Wesley 2000, ISBN 0-201-61633-5

The Unicode Consortium web site

Supporting Unicode Input

Unicode Hex Input キーボード(およびその他多数の XML Unicode キーボード)は、/System/Library/Keyboard¥ Layouts/Unicode.bundle/Contents/Resources/ にあります。

先頭に戻る

ダウンロード

Acrobat gif

このテクニカルノートの PDF 版(72K)

ダウンロード


先頭に戻る